// 访问者模式
class Company {
    create() {

    }
}
//具体访问者-艺术公司
class ArtCompany extends Company{
    create(el){
        if(el instanceof Paper){
           return "画图"
        }else if(el instanceof Cuprum){
           return "设计铜像"
        }
    }
}
//具体访问者-造钱公司
class Mint extends Company{
    create(el){
        if(el instanceof Paper){
            return "造纸币"
        }else if(el instanceof Cuprum){
            return "造铜币"
        }
    }
}
//抽象元素-材料
class Material{
    accept(visitor){}
}
//抽象元素-纸币
class Paper extends Material{
    accept(visitor){
         return visitor.create(this);
    }
}
//抽象元素-铜币
class Cuprum extends Material{
    accept(visitor){
        return visitor.create(this);
    }
}
//对象结构-添加或删除材料，根据不同的公司做出不同的东西
class SetMaterial{
    constructor(){
        this.list = [];
    }
    accept(visitor){
        let str = "";
        for(let i of this.list){
            str+=i.accept(visitor)+"\n";
        };
        return str;
    }
    add(el){
        this.list.push(el);
    }
    remove(el){
        this.list.filter((item)=>item!==el);
    }
}
class Customer{
    static main(){
        //定义材料对象
        let setMaterial = new SetMaterial();
        //添加材料
        setMaterial.add(new Paper());
        setMaterial.add(new Cuprum());
        //根据不同的公司生产不同的东西
        let pro = setMaterial.accept(new ArtCompany());
        let pro1 = setMaterial.accept(new Mint());
        console.log(pro);
        console.log(pro1);
    }
}
Customer.main();